package com.rc.web.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Row;
import com.rc.common.constant.OrderStatusType;
import com.rc.pojo.dto.order.OrderQuery;
import com.rc.pojo.po.Order;
import com.rc.pojo.vo.order.PageOrderVO;

import java.util.List;

import static com.mybatisflex.core.query.QueryMethods.dateFormat;
import static com.mybatisflex.core.query.QueryMethods.now;
import static com.rc.pojo.po.table.ConsumerTableDef.CONSUMER;
import static com.rc.pojo.po.table.FarmTableDef.FARM;
import static com.rc.pojo.po.table.OrderTableDef.ORDER;


/**
 *  映射层。
 *
 * @author sym
 * @since 2024-06-05
 */
public interface OrderMapper extends BaseMapper<Order> {

    /**
     * 查询用户的所有订单
     * @param conId
     * @return
     */
    default List<Row> selectListByConId(long conId) {
        return selectRowsByQuery(QueryWrapper.create()
                .select(ORDER.ALL_COLUMNS, FARM.NAME.as("farmName"))
               .where(ORDER.CON_ID.eq(conId))
                .join(FARM).on(ORDER.FARM_ID.eq(FARM.ID))
       );
   }


    /**
     * 查询用户所有已支付的订单
     * @param conId
     * @return
     */
   default List<Order> selectPayLisByConId(long conId){
       return selectListByQuery(QueryWrapper.create()
               .where(ORDER.CON_ID.eq(conId))
               .and(ORDER.STATUS.gt(OrderStatusType.CANCEL))
       );
   }

   /**
    * 分页查询订单
    * @param dto
    * @return
    */
   default Page<PageOrderVO> selectPage(OrderQuery dto){
       Page<PageOrderVO> page = Page.of(dto.getCurrent(), dto.getPageSize());
       return paginateAs(page, QueryWrapper.create()
               .select(ORDER.ALL_COLUMNS,CONSUMER.NAME.as("contact"))
               .join(CONSUMER).on(ORDER.CON_ID.eq(CONSUMER.ID))
                       .where(ORDER.STATUS.eq(dto.getStatus()))
                       .and(ORDER.ID.eq(dto.getId()))
               ,PageOrderVO.class);
   }

    /**
     * 根据时间格式查询 订单数
     * @param itemId
     * @param type
     * @param
     * @param format
     * @return
     */
   default long selectCountByFormat(Long itemId,Integer type,String format){
       return selectCountByQuery(QueryWrapper.create()
               .where(ORDER.ITEM_ID.eq(itemId))
               .and(ORDER.TYPE.eq(type))
               .and(dateFormat(now(),format).eq(dateFormat(ORDER.PAY_TIME,format)))
       );
   }

}
